#ifndef CNVTODISPALGORITHMPLUGIN_H
#define CNVTODISPALGORITHMPLUGIN_H

#include <QObject>
#include <QWidget>

#include <QCoreApplication>
#include <QSharedPointer>
#include <QScopedPointer>
#include <QPointer>
#include <QTimer>
#include <QMutex>
#include <QButtonGroup>

#include <QVariant>
#include <QStringList>

#include <QThread>

#include "RawImageDataHelp.h"
#include "cudaacclib.h"
#include "CNV_IMG_ALGORITHM_INTERFACE.h"

#include "opencv2/opencv.hpp"

using namespace OCTViewr2;

namespace Ui {

}
//  // 继承的QObject必须写在最前面
class CustomCnvToImgAlgorithmPlugin : public QObject, public IALGORITHM_CNV2IMG_INTERFACE
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "octviewer2.plugin.custom.algorithm.cnv2img" FILE "CustomCnvToImgAlgorithm.json")    //
    Q_INTERFACES(OCTViewr2::IALGORITHM_CNV2IMG_INTERFACE)
public:
    CustomCnvToImgAlgorithmPlugin(QObject *parent = nullptr);
    ~CustomCnvToImgAlgorithmPlugin();

//IALGORITHM_CNV2DISP_INTERFACE interface
public:
    //  //  设置 参数管理器指针      //  //
    void setSettingManagerPtr(SettingManager *ptr);

    //  //  设置 变量集管理器指针      //  //
    void setVarSetManagerPtr(VarSetManager *ptr);

    //  //  界面线 调用的 初始化函数   //  //
    void initByGUIThread();

    //  //  初始化线程 调用 的 初始化函数    //  //
    void initContext();

    //  // 获取插件实现的 QObject 指针   //  //
    QObject* obj();

    //  // 重新设置 内部缓冲    //  //
    void resetInterlBuffer(int cols,int rows,int type);

    //  // 接收数据到 内部缓冲    //  //
    void receiveInputData(const RAW_IMAGE_DATA &data);

    //  //获取 计算结果的 浅拷贝 (不能在外部释放内存)  //  //
    void getOutputDataShadowCopy(RAW_IMAGE_DATA &dst);

signals:
    //  //弹出信息到 信息栏         //  //
    void toastInfo(QString info,QString color="black");

//IALGORITHM_CNV2IMG_INTERFACE interface slots
public slots:
    //  // 响应用户等级变更     //  //
    void onAppAccountLevelChanged(int nowlevel);

    //  // 运行内部算法 计算输出结果    //  //
    void execAlgorithmProcess();

private slots:

private:
    //  //检查 基本的参数  //  //
    void checkParamters();

    //  //初始化 Cuda加速库   //  //
    void initCudaAccLib();

    //  //默认 内部算法变量设置     //  //
    void setDefaultInteralVar();

    //  //cpu算法     //  //
    void processByCPU();

    //  //gpu算法     //  //
    void processByGPU();

    //  //  转置 16位数据    //  //
    void transpose16BitData(int rows,int cols,void *src,void *dst);

    //  //  参数管理器指针      //  //
    OCTViewr2::SettingManager *m_settingManagerPtr;
    //  //  变量集管理器指针      //  //
    OCTViewr2::VarSetManager *m_VarSetManagerPtr;

    //  //内部用于接收 采集数据 的 缓冲区变量   //  //
    RAW_IMAGE_DATA  m_recvImgData;
    //  //  计算结果缓冲区 变量 (FFT后)   //  //
    RAW_IMAGE_DATA  m_resultImgData;

};

#endif // CNVTODISPALGORITHMPLUGIN_H
